# 读取
import yaml


# 读取测试用例
def read_testcase(file_path):
    with open(file_path,"r",encoding="utf-8") as f:
        case_list = yaml.safe_load(f)
        if len(case_list) >= 2: # 流程用例,[{},{},{}]改成[[{},{},{}]]
            return [case_list]
        else:
            if "parametrize" in dict(*case_list).keys(): #数据驱动[{}]
                new_caseinfo = ddts(*case_list)
                return new_caseinfo # 数据驱动用例，返回[{正例},{反例},{反例}]
            else:
                return case_list # 单接口，返回[{}]

def ddts(caseinfo:dict):
    # 数据驱动用例，返回[{正例},{反例},{反例}]
    # parametrize:
    # - ["username", "password"]
    # - ["admins", "123456"]
    # - ["admin", "12345"]
    # - ["12345"]
    # - ["admin", "123456", "hahaha"]
    data_list = caseinfo["parametrize"]
    # print("数据data_list",data_list)

    # 保存原始用例的YAML字符串
    str_caseinfo = yaml.dump(caseinfo)
    # print("原始用例的YAML字符串str_caseinfo",str_caseinfo)

    # 新建列表,[{正例},{反例},{反例}],放这个
    new_caseinfo = []

    # 遍历每一行数据（从第1行开始，第0行是参数名）
    for x in range(1,len(data_list)): # x表示行，下标从1开始
        # print("行",x)

        # 复制原始用例模板
        raw_caseinfo = str_caseinfo
        # print("复制原始用例模板",raw_caseinfo)

        # 获取当前行的参数值列表
        param_values = data_list[x]
        # print("当前行的参数值列表param_values",param_values)

        # 遍历每个参数名和对应的值
        for y in range(len(param_values)):
            # 防止参数值数量超过参数名数量
            if y >= len(data_list[0]):
                # logger.error(f"的第{x}行的parametrize数量超过参数名数量，忽略多余的值")
                print(f"警告：第{x}行的参数值数量超过参数名数量，忽略多余的值")
                break

            # 如果是数字类型的字符串，需要加上单引号

            param_name = data_list[0][y]  # 参数名在第0行
            param_value = param_values[y]
            # param_name password
            # param_value 123456

            # 替换变量
            # 变量格式是$ddt{参数名}
            raw_caseinfo = raw_caseinfo.replace(f"$ddt{{{param_name}}}", str(param_value))
            # print(f"替换$ddt{{{param_name}}}为{param_value}后的raw_caseinfo: {raw_caseinfo}")

        # 将处理后的YAML字符串转回字典
        case_dict = yaml.safe_load(raw_caseinfo)
        # print("字典case_dict",case_dict)

        # 删除parametrize字段，避免传递到测试用例中
        if "parametrize" in case_dict:
            del case_dict["parametrize"]

        # 添加到结果列表
        new_caseinfo.append(case_dict)

    # print("-----new_caseinfo", new_caseinfo)
    return new_caseinfo



